package com.atwisdom.star.core.dsl.modelClass.logic;

import com.alibaba.fastjson.JSONObject;
import com.atwisdom.star.common.vo.PageInfo;
import com.atwisdom.star.core.dao.pojo.modelClass.logic.LogicInstance;

import java.util.List;
import java.util.Map;

public interface LogicInstanceDslService {
    /**
     * 查询全部摘要（通用）
     * @return 查询结果
     */
    List<JSONObject> queryAllInfo();

    /**
     * 分页查询全部摘要（通用）
     * @param pageNumber 参数
     * @param pageSize 参数
     * @param orderBy 参数
     * @return 返回全部搞要列表
     */

    PageInfo queryAllInfoByPage(int pageNumber, int pageSize, String orderBy, boolean needHier);

    /**
     * 查询全部数据（通用）
     * @return
     */
    List<?> queryAll() ;

    //分页查询全部数据（通用）
    PageInfo listAllByPage(int pageNumber, int pageSize, String orderBy, boolean needHier);

    /**
     * 按条件查询模型
     *
     * @param condition 查询参数
     * @param className 查询参数
     * @param orderBy 排序参数
     * @return 返回值
     */
    List<JSONObject> query(String condition,String className,String orderBy);


    List<JSONObject> queryWithoutHier(String condition, String className, String orderBy);

    List<Long> queryIdWithoutHier(String condition, String className);

    List<JSONObject> query(String condition, String className);

    List<JSONObject> query(String condition, String className, String orderBy, String hierValueCondition);

    List<JSONObject> query(String condition, String className, String orderBy, String hierValueCondition,String parentId);

    List<LogicInstance> fetchInstanceList(String condition, String className, String orderBy);

    long count(String condition, String className);

    Map<Object, List<JSONObject>> queryAndGroupBy(String condition, String className, String groupByKey);


    List<JSONObject> queryGroupAndSum(String condition, String className, List<String> groupBy, String sumKey, String orderBy);

    /**
     * 按类名查找实例
     * @param className 类名
     * @return 返回实例表
     */
    List<LogicInstance> queryByClassName(String className);

    /**
     * 按类名查找实例
     * @param className 类名
     * @param hierFlag 是否查询hier
     * @return 返回实例表
     */
    List<LogicInstance> queryByClassName(String className, boolean hierFlag,String condition);

    /**
     * 根据id获取实例数据
     * @param id 主键id
     * @return 返回实例
     */
    LogicInstance queryById(Long id);

    /**
     * 根据id获取实例数据及关联的hier数据
     *
     * @param id 主键id
     * @return 返回实例
     */
    LogicInstance queryInsWithHierById(Long id);

    JSONObject queryJsonById(Long id);

    List<JSONObject> queryJsonByIdList(List<Long> idList);

    /**
     * 更新状态
     * @param id 实例id
     * @param statusCode 状态
     */
    void updateStatus(Long id, String statusCode);
    /**
     * 查询实例容器hier
     * @param id 参数
     * @return 返回hier
     */
    JSONObject queryHierById( Long id);


    /**
     * 按条件分页查询实例摘要
     *
     * @param pageNumber 查询参数
     * @param pageSize 查询参数
     * @param condition 查询参数
     * @param className 查询参数
     * @param orderBy 排序参数
     * @return 返回值
     */
    PageInfo queryInfoByPage(int pageNumber,int pageSize, String condition,String className,String orderBy, boolean needHier);

    /**
     * 按条件分页查询实例
     *
     * @param pageNumber 查询参数
     * @param pageSize 查询参数
     * @param condition 查询参数
     * @param className 查询参数
     * @param orderBy 排序参数
     * @return 返回值
     */
    PageInfo queryByPage(int pageNumber,int pageSize, String condition,String className,String orderBy, boolean needHier);

    /**
     * 按条件分页查询实例
     *
     * @param pageNumber 查询参数
     * @param pageSize   查询参数
     * @param condition  查询参数
     * @param className  查询参数
     * @param orderBy    排序参数
     * @return 返回值
     */
    PageInfo queryByPageWithoutHier(int pageNumber, int pageSize, String condition, String className, String orderBy);
    /**
     * 添加新模型
     * @param type 类型
     * @param className 类名
     * @return 返回模型记录
     */
    JSONObject add(String type, String className,String name,JSONObject hier);

    List<JSONObject> batchAddOrUpdate(List<JSONObject> insJsonList);

    void handleAutoGenValue(JSONObject targetValueJson);

    /**
     * 更新模型属性字段
     * 更新，需要同步更新实例，同步更新历史数据
     * 1、className 和 自定字段
     *
     * @param jsonObject 参数
     * @return 返回值
     */
    JSONObject updateById(JSONObject jsonObject);

    void updateFieldNullById(JSONObject jsonObject);


    JSONObject deductByCondition(String className, String condition, String dataDeductFieldName, JSONObject dataJson);

    /**
     * 更新模型属性字段
     * 更新，需要同步更新实例，同步更新历史数据
     * 1、className 和 自定字段
     *
     * @param jsonObjectList 参数
     * @return 返回值
     */
    List<JSONObject> updateByIds(List<JSONObject> jsonObjectList);


    /**
     * 更新模型类型和类名（配置阶段）
     * @param jsonObject 类型
     * @return 返回模型记录
     */
    List<JSONObject> updateClassName(JSONObject jsonObject) ;

    /**
     * 按ids删除模型
     * @param ids id列表
     * @return 返回结果
     */
    boolean deleteByIds(List<Long> ids);

    /**
     * 接className删除
     * 1、删除实例、2、删除历史 3、更新redis
     *
     * @param className 模型类名
     * @return 返回值
     */
     boolean deleteByClassName(String className);

    /**
     * 批量删除
     *
     * @param classNames 参数
     * @return 返回值
     */
    boolean deleteByClassNames(List<String> classNames);

    /**
     * 按Id 废除模型
     * @param ids
     * @return
     */
    boolean repealByIds(List<Long> ids);

    /**
     * 批量废除
     *
     * @param classNames 参数
     * @return 返回值
     */
    boolean repealByClassNames(List<String> classNames);

    List<JSONObject> updateByCondition(String className, String condition, JSONObject dataJson);

    /**
     * 批量更新
     * @param className 类名
     * @param jsonDataList 数据
     * @param featureName 可查询字段名
     * @param featureValues 可查询字段值列表
     */
   void updateBatchBy(String className, List<JSONObject> jsonDataList,String featureName,  List<String> featureValues);

    List<JSONObject> updateByBatchId(JSONObject data);
}
